1. Análise de Sentimentos

1. Objetivo

Determinar o valor subjetivo de um documento de texto, ou seja, como positivo ou negativo é o conteúdo de um documento de texto.

1. Problema

A empresa Amazon deseja obter um sistema inteligente para processar os comentários de seus clientes sobre os seus produtos, podendo classificar tais comentários dentre as categorias: positivo ou negativo. Para isso ela disponibiliza três bases de dados com sentenças rotuladas.

1. Os Dados

Os dados estão organizados em sentença e rótulo, sendo 0 negativo e 1 positivo As bases são provenientes dos seguintes sites:

  • imdb.com
  • amazon.com
  • yelp.com

1. Preparação

FROM python:3 
ENV PYTHONUNBUFFERED 1 

RUN mkdir /code 
WORKDIR /code 

ADD . /code/
RUN pip install scikit-learn pandas matplotlib scipy jupyter nltk

RUN chmod +x boot.sh

EXPOSE 8888
CMD ["/bin/sh", "./boot.sh"]

Boot.sh:

python << END
import sys
import nltk

nltk.download('punkt')
nltk.download('stopwords')
END

jupyter notebook --ip=0.0.0.0 --allow-root

Build:

docker build -t machine-learn .

Para executar, use o comando:

docker run --name machine-learn-container -p 8888:8888 -v ~/amazon/jeferson:/code machine-learn:latest /bin/sh ./boot.sh

1. Pré-processamento

As três bases de dados do problema devem ser usadas em conjunto. A biblioteca pandas pode ser usada para facilitar esse processo. O código abaixo importa as bases e as concatena em uma base maior. Ao final, é gerado um arquivo com extensão csv, o qual será usado para os treinos e análises futuras.


In [ ]:
import pandas

imdb = pandas.read_csv('data/imdb_labelled.txt', sep="\t", names=["sentences", "polarity"])
yelp = pandas.read_csv('data/yelp_labelled.txt', sep="\t", names=["sentences", "polarity"])
amazon = pandas.read_csv('data/amazon_cells_labelled.txt', sep="\t", names=["sentences", "polarity"])

big = pandas.DataFrame()
big = big.append([imdb, yelp, amazon])

big.to_csv('big.csv', index=False, encoding='utf-8')

1. Tokenization

Para a criação de um dicionário, precisa-se transformar o texto em tokens. Para auxiliar nessa tarefa pode-se utilizar uma biblioteca para processamento de linguagem natural, no exemplo abaixo, usa-se o nltk. O nltk é uma biblioteca Python de código aberto que realiza esta função.


In [ ]:
import nltk

sentence = 'My test for nltk library!!'
tokens = nltk.word_tokenize(sentence)

print(tokens)

1. Dicionário

Para criar um dicionário, precisamos usar apenas a coluna que contém as sentenças no arquivo e ignorar a coluna da polaridade. Novamente, o nltk facilita esse processo. Obtidas as sentenças, usaremos o nltk para quebrá-las em tokens.


In [ ]:
import nltk

sentences = big['sentences']
sentences_strings = sentences.str.lower()

sentences_tokens = [] # Has all sentences tokens
for sentence_string in sentences_strings:
	token = nltk.word_tokenize(sentence_string)
	sentences_tokens.extend(token)
    
dictionary = set()
dictionary.update(sentences_tokens)

1. Vetorização

Usa-se a vetorização para tornar possível o trabalho dos classificadores. Na vetorização do texto, cada palavra é tratada como uma característica


In [28]:
import numpy

tuplas = zip(dicionario, range(len(dicionario)))
mapa = {sentence_tokens:indice for sentence_tokens, indice in tuplas}

def vetorizar_texto(texto, mapa):
    vetor = [0] * len(mapa)
    for sentence_tokens in texto:
        if sentence_tokens in mapa:
            posicao = mapa[sentence_tokens]
            vetor[posicao] += 1
    return vetor

vetoresdeTexto = [vetorizar_texto(texto, mapa) for texto in sentences_tokens]
X = numpy.array(vetoresdeTexto)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-28-41f377a7eec7> in <module>()
     12     return vetor
     13 
---> 14 vetoresdeTexto = [vetorizar_texto(texto, mapa) for texto in palavras]
     15 X = numpy.array(vetoresdeTexto)

NameError: name 'palavras' is not defined

1. Word normalization

Uma abordagem comum na análise de sentimentos é o uso de digramas ou trigramas, isso auxilia na classificação de sentenças. Dado um vetor de tokens onde já se foram eliminados as repetições e stop words, podemos criar digramas como segue:


In [25]:
dictionary = set()

tokens = ['teste1', 'teste2', 'teste3', 'teste4']

for x in range(len(tokens)):
    if x + 1 < len(tokens):
        digram = [tokens[x]+' '+tokens[x+1]]
        dictionary.update(digram)
        
print(dictionary)


{'teste3 teste4', 'teste1 teste2', 'teste2 teste3'}

1. Avaliação da Classificação

1. Referências